/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package redinftel.formularios;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import redinftel.entidades.Perfil;
import redinftel.entidades.Usuario;
import redinftel.sesiones.PerfilFacadeRemote;
import redinftel.sesiones.UsuarioFacadeRemote;

/**
 *Clase que realiza el registro del usuario
 * @author Six Degrees Team
 */
@ManagedBean
@RequestScoped
public class RegisterBean {
    @EJB
    private PerfilFacadeRemote perfilFacade;
    @EJB
    private UsuarioFacadeRemote usuarioFacade;

    private String nombre;
    private String apellidos;
    private String email1;
    private String email2;
    private String fecha;
    private String sexo;
    private int codigoError;

    public int getCodigoError() {
        return codigoError;
    }

    public void setCodigoError(int codigoError) {
        this.codigoError = codigoError;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getEmail1() {
        return email1;
    }

    public void setEmail1(String email1) {
        this.email1 = email1;
    }

    public String getEmail2() {
        return email2;
    }

    public void setEmail2(String email2) {
        this.email2 = email2;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getSexo() {
        return sexo;
    }

    public void setSexo(String sexo) {
        this.sexo = sexo;
    }


    /** Creates a new instance of RegisterBean */
    public RegisterBean() {
          ChangeLocaleBean.cambiar();
    }
/**
 *
 * @return devueleve el index en caso de realiar el registro correctamente
 */
    public String doRegister (){
        FacesContext con= FacesContext.getCurrentInstance();
        fecha=con.getExternalContext().getRequestParameterMap().get("datepicker");
        if(nombre.equals("") || apellidos.equals("") || email1.equals("") || email2.equals("") || fecha.equals("")){
            codigoError=1;
        }
        else if(!email1.equals(email2))
        {
            codigoError=2;
        }
        else if(!validarEmail()){
            codigoError=3;
        } else {
            List<Usuario> usuario = usuarioFacade.findByEmail(email1);
            if (!usuario.isEmpty()) {
                codigoError=4;
            } else {

                try {
                    //Obtencion fechas
                    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
                    Date parse = df.parse(fecha);
                    Date fechaActual = new Date();

                    //Construccion del nuevo usuario
                    Integer PK = Integer.parseInt(usuarioFacade.findPK().toString()) + 1;
                    String codigo = getCadenaAlfanumAleatoria(6);
                    Usuario nuevoUsuario = new Usuario();
                    nuevoUsuario.setEmail(email1);
                    nuevoUsuario.setCodigoValidacion(codigo);
                    nuevoUsuario.setEstado("INACTIVO");
                    nuevoUsuario.setIdUsuario(new BigDecimal(PK));

                    //Construccion datos perfil nuevo usuario
                    Perfil nuevoPerfil = new Perfil();
                    nuevoPerfil.setIdUsuario(new BigDecimal(PK));
                    nuevoPerfil.setNombre(nombre);
                    nuevoPerfil.setApellidos(apellidos);
                    nuevoPerfil.setFechaNacimiento(parse);
                    nuevoPerfil.setFechaRegistro(fechaActual);
                    nuevoPerfil.setSexo(sexo);

                    //Insercion datos
                    usuarioFacade.create(nuevoUsuario);
                    perfilFacade.create(nuevoPerfil);

                    try {
                        this.enviarEmail(codigo);
                    } catch (MessagingException ex) {
                        Logger.getLogger(RegisterBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                    codigoError=5;
                } catch (ParseException ex) {
                    Logger.getLogger(ModificarBean.class.getName()).log(Level.SEVERE, null, ex);
                    codigoError=6;
                    return "index";
                }
            }
        }
        return "index";
    }
/**
 *
 * @param longitud
 * @return una cadena aleatoria que seria el codigo de validacion
 */
    public String getCadenaAlfanumAleatoria(int longitud) {
        String cadenaAleatoria = "";
        long milis = new java.util.GregorianCalendar().getTimeInMillis();
        Random r = new Random(milis);
        int i = 0;
        while (i < longitud) {
            char c = (char) r.nextInt(255);
            if ((c >= '0' && c <= 9) || (c >= 'A' && c <= 'Z')) {
                cadenaAleatoria += c;
                i++;
            }
        }
        return cadenaAleatoria;
    }

    public boolean validarEmail() {
        Pattern p = Pattern.compile("^[\\w\\-\\_]+(\\.[\\w\\-\\_]+)*@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$");
        Matcher m = p.matcher(email1);
        if (m.find()) {
            //Es correcta
            return true;
        } else {
            //No es correcta
            return false;
        }
    }

    public void enviarEmail(String codigo) throws MessagingException {
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.gmail.com");
        props.setProperty("mail.smtp.starttls.enable", "true");
        props.setProperty("mail.smtp.port","587");
        props.setProperty("mail.smtp.user", "red.sixdegrees@gmail.com");
        props.setProperty("mail.smtp.auth", "true");

        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);

        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress("red.sixdegrees@gmail.com"));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(this.email1));
        message.setSubject("Registro en Red Social");
        message.setText("Hola \nBienvenido a la red social Six Degrees. Para completar el registro entre"
                + " a http://localhost:8080/redinftel-war/faces/activar.jsp"
                + " e introduzca su codigo de validacion: "+codigo);

        Transport t = session.getTransport("smtp");
        t.connect("red.sixdegrees@gmail.com","redsocial");
        t.sendMessage(message,message.getAllRecipients());
        t.close();
    }
}